#ifndef CHESS_GAME_H
#define CHESS_GAME_H

#include "main.h"
#include "game_mode.h"
#include "ai_strategy.h"
#include <memory>

// 棋盘参数
const int GRID_SIZE = 50;
const int BOARD_ROWS = 10; // 棋盘行数
const int BOARD_COLS = 9;  // 棋盘列数
const int BOARD_START_X = (800 - (BOARD_COLS - 1) * GRID_SIZE) / 2 - GRID_SIZE;
const int BOARD_START_Y = (480 - (BOARD_ROWS - 1) * GRID_SIZE) / 2;

class ChessGame
{
private:
    GameMode currentMode;               // 当前游戏模式
    bool gameOver;                      // 游戏是否结束
    PieceColor currentPlayer;           // 当前回合玩家
    vector<vector<ChessPiece *>> board; // 棋盘状态
    Point selectedPiece;                // 选中的棋子位置
    bool hasSelectedPiece;              // 是否有选中的棋子

public:
    ChessGame(GameMode mode);
    ~ChessGame();

    // 初始化棋盘
    void initBoard();

    // 显示棋盘和棋子
    void displayBoard(Lcd *lcd);

    // 处理游戏中的触摸事件
    void handleTouch(Point &touchPoint, Lcd *lcd);

    // 重置游戏
    void reset();

    // 判断是否将军
    bool isInCheck(PieceColor color);

    // 判断游戏是否结束
    bool isGameOver();

    // 显示消息的方法
    void showMessage(Lcd *lcd, const string &msg);
    void drawMessage(Lcd *lcd);

    // 获取当前玩家
    PieceColor getCurrentPlayer() const { return currentPlayer; }

    // 设置AI策略
    void setAIStrategy(AIStrategy *strategy)
    {
        aiStrategy.reset(strategy);
    }

    // 执行AI走棋
    void makeAIMove();

    // 获取棋盘状态(供AI使用)
    const std::vector<std::vector<ChessPiece *>> &getBoard() const
    {
        return board;
    }

    // 模拟走棋(用于AI搜索)
    bool simulateMove(int srcX, int srcY, int destX, int destY);
    
    // 需要添加拷贝构造函数(用于AI模拟)
    ChessGame(const ChessGame &other);

    void handleNetworkMove(int fromX, int fromY, int toX, int toY);
    void sendMoveToNetwork(int fromX, int fromY, int toX, int toY);

private:
    // 坐标转换
    void boardToScreen(int boardX, int boardY, int &screenX, int &screenY);
    void screenToBoard(int screenX, int screenY, int &boardX, int &boardY);

    // 获取棋子图片路径
    string getPieceImagePath(ChessPiece *piece);

    // 旋转显示图片
    void showRotatedImage(BMP &image, int *mp, int centerX, int centerY);

    // 移动棋子逻辑
    bool movePiece(int srcX, int srcY, int destX, int destY, Lcd *lcd);

    // 切换当前玩家
    void switchPlayer() { currentPlayer = (currentPlayer == Red) ? Black : Red; }

    Point findKingPosition(PieceColor color);

    string message;                               // 当前显示的消息
    int messageStartTime;                         // 消息显示开始时间(毫秒)
    static const int MESSAGE_DISPLAY_TIME = 2000; // 消息显示时间(毫秒)
    std::unique_ptr<AIStrategy> aiStrategy;       // AI策略对象
};

#endif // CHESS_GAME_H